#pragma once
#include <QString>

/**
 * @brief 电机配置类 - 管理电机相关的配置参数
 * 
 * 这个类用于集中管理所有电机相关的配置参数，
 * 避免在代码中使用硬编码数值，提高系统的可维护性和灵活性。
 */
class MotorConfig {
public:
    // FuYu电机默认配置
    struct FuYuMotorDefaults {
        static constexpr double MOTOR_MAX_TRAVEL = 167.0;     // 电机物理最大行程 (mm)
        static constexpr double OPTICAL_PATH_MIN = 121.0;       // 光路最小位置 (mm) - 也是系统初始位置
        static constexpr double OPTICAL_PATH_MAX = 455.0;       // 光路最大位置 (mm) - 实际可测量的最大位置
        static constexpr double SAFETY_MARGIN = 0.0;           // 安全边界
    };

    // 默认运动参数
    struct MotionDefaults {
        static constexpr double DEFAULT_SPEED = 10.0;          // 默认速度 (mm/s)
        static constexpr double DEFAULT_ACCELERATION = 200.0;  // 默认加速度 (mm/s²)
        static constexpr double DEFAULT_DECELERATION = 200.0;  // 默认减速度 (mm/s²)
        static constexpr double HOME_SPEED = 10.0;             // 回零速度 (mm/s)
        static constexpr double HOME_ACC_DEC = 200.0;          // 回零加减速度 (mm/s²)
        static constexpr double HOME_FALL_STEP = 0.0;          // 脱落距离 (mm)
    };

    // 连接参数
    struct ConnectionDefaults {
        static const QString DEFAULT_IP_ADDRESS;
        static constexpr int DEFAULT_PORT = 8088;
        static constexpr int DEFAULT_DEVICE_ID = 0;
        static constexpr int DEFAULT_AXIS = 0;
    };

private:
    // 当前配置值
    double m_motorMaxTravel;        // 电机物理最大行程
    double m_opticalPathMin;        // 光路最小位置（系统初始位置）
    double m_opticalPathMax;        // 光路最大位置（可测量的最大位置）
    double m_safetyMargin;          // 安全边界

    // 运动参数
    double m_defaultSpeed;
    double m_defaultAcceleration;
    double m_defaultDeceleration;
    double m_homeSpeed;
    double m_homeAccDec;
    double m_homeFallStep;

    // 连接参数
    QString m_defaultIpAddress;
    int m_defaultPort;
    int m_defaultDeviceId;
    int m_defaultAxis;

    static MotorConfig* instance;

public:
    // 单例模式
    static MotorConfig* getInstance();
    static void destroyInstance();

    // 构造函数 - 使用默认值初始化
    MotorConfig();

    // 获取器方法
    double getMotorMaxTravel() const { return m_motorMaxTravel; }
    double getOpticalPathMin() const { return m_opticalPathMin; }
    double getOpticalPathMax() const { return m_opticalPathMax; }
    double getSafetyMargin() const { return m_safetyMargin; }

    // 计算得出的值
    double getCalculatedOpticalPathMax() const { 
        // 理论光路最大位置 = 光路最小位置 + 电机行程 * 2
        return m_opticalPathMin + m_motorMaxTravel * 2; 
    }
    double getEffectiveOpticalPathMax() const { 
        // 有效光路最大位置（含安全边界）
        return getCalculatedOpticalPathMax() + m_safetyMargin; 
    }


    // 运动参数获取器
    double getDefaultSpeed() const { return m_defaultSpeed; }
    double getDefaultAcceleration() const { return m_defaultAcceleration; }
    double getDefaultDeceleration() const { return m_defaultDeceleration; }
    double getHomeSpeed() const { return m_homeSpeed; }
    double getHomeAccDec() const { return m_homeAccDec; }
    double getHomeFallStep() const { return m_homeFallStep; }

    // 连接参数获取器
    QString getDefaultIpAddress() const { return m_defaultIpAddress; }
    int getDefaultPort() const { return m_defaultPort; }
    int getDefaultDeviceId() const { return m_defaultDeviceId; }
    int getDefaultAxis() const { return m_defaultAxis; }

    // 设置器方法
    void setMotorMaxTravel(double value) { m_motorMaxTravel = value; }
    void setOpticalPathMin(double value) { m_opticalPathMin = value; }
    void setOpticalPathMax(double value) { m_opticalPathMax = value; }
    void setSafetyMargin(double value) { m_safetyMargin = value; }


    // 运动参数设置器
    void setDefaultSpeed(double value) { m_defaultSpeed = value; }
    void setDefaultAcceleration(double value) { m_defaultAcceleration = value; }
    void setDefaultDeceleration(double value) { m_defaultDeceleration = value; }
    void setHomeSpeed(double value) { m_homeSpeed = value; }
    void setHomeAccDec(double value) { m_homeAccDec = value; }
    void setHomeFallStep(double value) { m_homeFallStep = value; }

    // 连接参数设置器
    void setDefaultIpAddress(const QString& value) { m_defaultIpAddress = value; }
    void setDefaultPort(int value) { m_defaultPort = value; }
    void setDefaultDeviceId(int value) { m_defaultDeviceId = value; }
    void setDefaultAxis(int value) { m_defaultAxis = value; }

    // 验证方法
    bool isValidOpticalPathPosition(double position) const {
        // 验证位置是否在光路有效范围内
        return position >= m_opticalPathMin && position <= m_opticalPathMax;
    }

    bool isValidCalculatedPosition(double position) const {
        // 验证位置是否在理论计算范围内
        return position >= m_opticalPathMin && position <= getCalculatedOpticalPathMax();
    }

    // 配置文件操作
    void loadFromFile(const QString& filePath);
    void saveToFile(const QString& filePath) const;
    void resetToDefaults();

    // 配置验证
    bool validateConfiguration() const;
    QString getConfigurationError() const;
};
